/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dao.ManterEnderecoDAO;
import dominio.Endereco;
import dominio.Fornecedor;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import negocio.ManterEnderecoNegocio;
import negocio.ManterFornecedorNegocio;

/**
 *
 * @author Cícero
 * Classe usada para receber e fazer requisições com o servidor.
 */
@ManagedBean
@SessionScoped
public class ManterFornecedorBean {

    private ManterFornecedorNegocio manterFornecedorNegocio;
    private Fornecedor fornecedor;
    private Endereco endereco;
    private boolean exibeTabela;
    private ManterEnderecoNegocio manterEnderecoNegocio;
    /** Estrutura de dados usada para armazenar os fornecedores contidos no banco de dados<br>
     * Será usada para exibir a lista dos fornecedores na tela.
     */
    private List<Fornecedor> fornecedores;
    /** Variável que irá receber o valor false quando o usuário selecionar algum fornecedor.*/
    private boolean naoSelecionouFornecedor = true;

    public ManterFornecedorBean() {
        inicializarAtributos();
    }

    /**
     * Método que inicializa todos os atributos do ManterFornecedorBean
     */
    private void inicializarAtributos() {
        manterFornecedorNegocio = new ManterFornecedorNegocio();
        fornecedor = new Fornecedor();
        fornecedores = new ArrayList<Fornecedor>();
        exibeTabela = false;
        endereco = new Endereco();
        manterEnderecoNegocio = new ManterEnderecoNegocio();
    }

    /**
     * Método que irá chamar o método create() da classe ManterFornecedorNegócio.
     *
     */
    public void create() {
        int resEndereco = manterEnderecoNegocio.create(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {
            fornecedor.setEndereco(endereco);
            /** Variável usada para receber o retorno do método create() da classe manterFornecedorNegocio.<br>
             * Esse retorno é usado para saber se o fornecedor foi armazenado ou não, distinguindo assim os possíveis erros.
             */
            int res = manterFornecedorNegocio.create(fornecedor);
            /** switch usado para mostrar a mensagem de inserção ao usário de acordo com o valor da
             * variável res.
             */
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(1), new Integer(0)});
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    manterEnderecoNegocio.destroy(endereco);
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(0), new Integer(0), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    manterEnderecoNegocio.destroy(endereco);
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o edit da classe manterFornecedorNegocio. É usado para editar um fornecedor.
     *
     */
    public void edit() {
        Endereco endOld = new Endereco();
        endOld = manterFornecedorNegocio.findFornecedor(fornecedor).getEndereco();
        int resEndereco = manterEnderecoNegocio.edit(endereco);

        if (resEndereco == VariaveisEstaticas.SUCESSO) {

            fornecedor.setEndereco(endereco);

            int res = manterFornecedorNegocio.edit(fornecedor);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(1), new Integer(1)});

                    naoSelecionouFornecedor = true;   // Caso ele consiga excluir o fornecedor, então essa variável irá receber true para desabilitar o botão.
                    //produto = new Produto();
                    inicializarAtributos();
                    break;

                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    manterEnderecoNegocio.edit(endOld);
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(0), new Integer(0), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    manterEnderecoNegocio.edit(endOld);
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        } else {
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /**
     * Método que irá chamar o destroy() da classe manterFornecedorNegocio, será chamado para excluir um fornecedor.
     *
     */
    public void destroy() {
        int resEndereco = manterEnderecoNegocio.destroy(endereco);
        if (resEndereco == VariaveisEstaticas.SUCESSO) {

            int res = manterFornecedorNegocio.destroy(fornecedor);
            exibeTabela = false;
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(1), new Integer(2)});

                    naoSelecionouFornecedor = true;   // Caso ele consiga excluir o fornecedor, então essa variável irá receber true para desabilitar o botão.
                    inicializarAtributos();
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
                    break;
            }
        }else{
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO2", new Integer[]{new Integer(6), new Integer(5), new Integer(1)});
        }
    }

    /** Método que tem a função de buscar todos os produtos no BD e armazena-los na estrutura produtos*/
    public void findFornecedorEntities() {
        exibeTabela = true;
        fornecedores = manterFornecedorNegocio.findFornecedorEntities();
    }

    public Fornecedor getFornecedor() {
        return fornecedor;
    }

    public void setFornecedor(Fornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }

    public List<Fornecedor> getFornecedores() {
        return fornecedores;
    }

    public void setFornecedores(List<Fornecedor> fornecedores) {
        this.fornecedores = fornecedores;
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public boolean isNaoSelecionouFornecedor() {
        return naoSelecionouFornecedor;
    }

    public void setNaoSelecionouFornecedor(boolean naoSelecionouFornecedor) {
        this.naoSelecionouFornecedor = naoSelecionouFornecedor;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}
